﻿using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using BoneSystem.Business.Entity.CadastrosOficiais.Endereco;
using BoneSystem.Business.Enum;

namespace BoneSystem.Business.Entity.Pessoa.ClassesRelacionadas
{
    /// <summary>
    /// Classe que define uma relação entre endereço e funcionário.
    /// </summary>
    [Serializable]
    public class PessoaEndereco : PropertiesBase
    {
        private BoneSystem.Business.Entity.Pessoa.Pessoa _pessoa;
        private Endereco _endereco;
        private string _logradouro;
        private string _numero;
        private string _complemento;
        private bool _informadoManualmente;
        private TipoEnderecoEnum _tipoEndereco;
        private string _pontoReferencia;

        /// <summary>
        /// Identificador.
        /// </summary>
        public virtual int Id { get; set; }
        
        public virtual Guid IdGuid { get; set; }

        /// <summary>
        /// Referência ao funcionário.
        /// </summary>
        public virtual BoneSystem.Business.Entity.Pessoa.Pessoa Pessoa
        {
            get { return _pessoa; }
            set
            {
                _pessoa = value; 
                
            }
        }

        /// <summary>
        /// Referência ao endereço.
        /// </summary>
        public virtual Endereco Endereco
        {
            get { return _endereco; }
            set
            {
                _endereco = value;
                
            }
        }

        /// <summary>
        /// Guarda o endereço que foi informado manualmente pelo usuário.
        /// </summary>
        [StringLength(Constants.MaxLengthNames, MinimumLength = Constants.MinLengthNames,
            ErrorMessage = Constants.MessageLengthNameError)]
        [Required(ErrorMessage = Constants.MessageRequiredError)]
        [Display(Name = "Logradouro", Description = "Logradouro")]
        public virtual string Logradouro
        {
            get { return _logradouro; }
            set
            {
                _logradouro = value; 
                
            }
        }

        [Required(ErrorMessage = Constants.MessageRequiredError)]
        [Display(Name = "Número", Description = "Número do logradouro")]
        public virtual string Numero
        {
            get { return _numero; }
            set
            {
                _numero = value;
                
            }
        }

        [Display(Name = "Complemento", Description = "Complemento do endereço")]
        public virtual string Complemento
        {
            get { return _complemento; }
            set
            {
                _complemento = value; 
                
            }
        }

        /// <summary>
        /// Guarda a informação que diz se o endereço foi informado manualmente.
        /// </summary>
        public virtual bool InformadoManualmente
        {
            get { return _informadoManualmente; }
            set
            {
                _informadoManualmente = value;
                
            }
        }

        [Required(ErrorMessage = Constants.MessageRequiredError)]
        [Display(Name = "Tipo", Description = "Tipo de endereço")]
        public virtual TipoEnderecoEnum TipoEndereco
        {
            get { return _tipoEndereco; }
            set { _tipoEndereco = value; 
                
            }
        }

        [Display(Name = "Ponto de referência", Description = "Descrição detalhada do endereço.")]
        public virtual String PontoReferencia
        {
            get { return _pontoReferencia; }
            set
            {
                _pontoReferencia = value; 
                
            }
        }

        
    }
}
